home *** CD-ROM | disk | FTP | other *** search
/ The 640 MEG Shareware Studio 2 / The 640 Meg Shareware Studio CD-ROM Volume II (Data Express)(1993).ISO / clang / nn.zip / PATCH03 < prev    next >
Internet Message Format  |  1989-12-29  |  35KB

  1. From: storm@texas.dk (Kim F. Storm)
  2. Subject: NN 6.3  --  Official Patch #3
  3. Date: 30 Jun 89 10:50:21 GMT
  4.  
  5. Patch file 1 of 1
  6.  
  7. This is patch #3 for nn release 6.3.
  8.  
  9. Apply it using the :patch command in nn.
  10.  
  11.  
  12. ABOUT PATCH #3
  13.  
  14. This patch fixes a major problem on some systems which is not seen
  15. at all on other systems (including mine):  NN wont find any news.  
  16. A zillion thanks to Aaron Pelton for tracking down this nasty bug.
  17.  
  18. It also fixes a few portability problems related to cpp (Thanks to
  19. Chip Rosenthal).
  20.  
  21. It provides a faked siginterrupt for systems that need it. (Thanks to
  22. Chris Smith).
  23.  
  24. The m-template.h file now describes the possibility to set STRCSPN and
  25. NO_SIGINTERRUPT. 
  26.  
  27. The stdin, stdout, and stderr are closed by the nnmaster when it is
  28. collecting news. (Thanks to Brad Allen).
  29.  
  30. The right patchlevel will be shown by nn after compilation.
  31.  
  32. Two new commands in reading mode:
  33. a {advance-article}
  34. b {back-article}
  35.     These go to the next or previous article (on the menu) even
  36.     when they are not selected.
  37.  
  38. An addition to the K {kill-select} command:  If the specified name or
  39. subject starts with a /, the rest of the input string is used as a
  40. regular expression.
  41.  
  42. There is a new variable 'cross-post' to have cross-posted articles shown
  43. in all the addressed groups.
  44.  
  45. The reading mode prompt line will now show when articles have been
  46. saved or responded to, e.g. -----(Filed)----- 
  47.  
  48. nnquery has been fixed (it could not locate the active file).
  49.  
  50. Since the header file data.h has been changed, all files will be
  51. recompiled when you `make all'.
  52.  
  53.  
  54. I have received new s- and m- files for the following systems and/or
  55. machines: 
  56.     dynix / symmetry
  57.     A/UX 1.1
  58.     convex
  59.     xenix386
  60. If you need one of these now, mail me.  I will not post them until I
  61. have got a few more.
  62.  
  63. ++Kim Storm
  64.  
  65.  
  66. *** /usr/storm/nn6.3.2/patchlevel.h
  67. --- patchlevel.h
  68. **************
  69. *** 10,15
  70.    *
  71.    *    1989-06-06:  Patch 1: rc.c
  72.    *    1989-06-28:  Patch 2: several files
  73.    */
  74.   
  75.   #define PATCHLEVEL 2
  76. --- 10,16 -----
  77.    *
  78.    *    1989-06-06:  Patch 1: rc.c
  79.    *    1989-06-28:  Patch 2: several files
  80. +  *    1989-06-30:  Patch 3: several files
  81.    */
  82.   
  83.   #define PATCHLEVEL 3
  84. **************
  85. *** 12,16
  86.    *    1989-06-28:  Patch 2: several files
  87.    */
  88.   
  89. ! #define PATCHLEVEL 2
  90.   
  91. --- 13,17 -----
  92.    *    1989-06-30:  Patch 3: several files
  93.    */
  94.   
  95. ! #define PATCHLEVEL 3
  96.   
  97.  
  98. *** /usr/storm/nn6.3.2/answer.c
  99. --- answer.c
  100. **************
  101. *** 72,77
  102.       
  103.       if (command == K_REPLY) {
  104.       pgm = "reply";
  105.       
  106.       if (reply_to(t, news.ng_reply) ||
  107.           reply_to(t, news.ng_from) ||
  108. --- 72,78 -----
  109.       
  110.       if (command == K_REPLY) {
  111.       pgm = "reply";
  112. +     ah->flag |= A_ST_REPLY;
  113.       
  114.       if (reply_to(t, news.ng_reply) ||
  115.           reply_to(t, news.ng_from) ||
  116. **************
  117. *** 108,113
  118.       if (command == K_FOLLOW_UP) {
  119.       pgm = "follow";
  120.       record_file = news_record;
  121.       
  122.       ng_line(t);
  123.   
  124. --- 109,115 -----
  125.       if (command == K_FOLLOW_UP) {
  126.       pgm = "follow";
  127.       record_file = news_record;
  128. +     ah->flag |= A_ST_FOLLOW;
  129.       
  130.       ng_line(t);
  131.   
  132.  
  133. *** /usr/storm/nn6.3.0/collect.c
  134. --- collect.c
  135. **************
  136. *** 103,109
  137.       art_hdr.a_number = art_num;
  138.       art_hdr.hpos = (off_t)0;
  139.       art_hdr.lpos = (off_t)0;
  140.       mode = FILL_NEWS_HEADER | FILL_OFFSETS | SKIP_HEADER; 
  141.       if ((gh->group_flag & (G_CONTROL | G_NEVER_DIGEST | G_ALWAYS_DIGEST)) == 0)
  142.       mode |= DIGEST_CHECK;
  143. --- 103,110 -----
  144.       art_hdr.a_number = art_num;
  145.       art_hdr.hpos = (off_t)0;
  146.       art_hdr.lpos = (off_t)0;
  147. !     art_hdr.flag = 0;
  148. !     
  149.       mode = FILL_NEWS_HEADER | FILL_OFFSETS | SKIP_HEADER; 
  150.       if ((gh->group_flag & (G_CONTROL | G_NEVER_DIGEST | G_ALWAYS_DIGEST)) == 0)
  151.       mode |= DIGEST_CHECK;
  152.  
  153. *** /usr/storm/nn6.3.2/data.h
  154. --- data.h
  155. **************
  156. *** 84,90
  157.   
  158.       char        *kill_list;
  159.       char        *save_file;     /* default save file from init */
  160.       off_t        rc_offset;    /* offset in rc_file */
  161.   } group_header;
  162.   
  163. --- 84,91 -----
  164.   
  165.       char        *kill_list;
  166.       char        *save_file;     /* default save file from init */
  167. !     char        *enter_macro;
  168. !     
  169.       off_t        rc_offset;    /* offset in rc_file */
  170.   } group_header;
  171.   
  172. **************
  173. *** 119,125
  174.   
  175.       group_header *a_group;    /* if merged article menu    */
  176.       
  177. !     int    flag;            /* flags:             */
  178.   
  179.   #    define AF(n) (1<<(n-1))
  180.   
  181. --- 120,126 -----
  182.   
  183.       group_header *a_group;    /* if merged article menu    */
  184.       
  185. !     int32    flag;        /* flags:             */
  186.   
  187.   #    define AF(n) (1<<(n-1))
  188.   
  189. **************
  190. *** 131,136
  191.   #    define A_FOLDER        AF(6)    /* article file = "folder_path"    */
  192.   #    define A_CANCEL        AF(7)    /* folder entry cancelled    */
  193.   #    define A_SEEN        AF(8)    /* article presented on menu    */
  194.   
  195.   } article_header;
  196.   
  197. --- 132,141 -----
  198.   #    define A_FOLDER        AF(6)    /* article file = "folder_path"    */
  199.   #    define A_CANCEL        AF(7)    /* folder entry cancelled    */
  200.   #    define A_SEEN        AF(8)    /* article presented on menu    */
  201. + #    define A_ST_FILED    AF(16)    /* articles is saved        */
  202. + #    define A_ST_REPLY    AF(17)    /* sent reply to article    */
  203. + #    define A_ST_FOLLOW    AF(18)    /* sent followup to article    */
  204.   
  205.   } article_header;
  206.   
  207.  
  208. *** /usr/storm/nn6.3.2/group.c
  209. --- group.c
  210. **************
  211. *** 13,18
  212.   
  213.   export int  dont_split_digests = 0;
  214.   export int  dont_sort_articles = 0;
  215.   
  216.   import int  article_limit, also_read_articles;
  217.   import int  no_update;
  218. --- 13,19 -----
  219.   
  220.   export int  dont_split_digests = 0;
  221.   export int  dont_sort_articles = 0;
  222. + export int  also_cross_postings = 0;
  223.   
  224.   import int  article_limit, also_read_articles;
  225.   import int  no_update;
  226. **************
  227. *** 390,396
  228.       fl;
  229.   
  230.       access_mode = 0;
  231. !     if (also_read_articles || submask)
  232.       access_mode |= ALSO_CROSS_POSTINGS;
  233.       if (dont_split_digests)
  234.       access_mode |= DONT_SPLIT_DIGESTS;
  235. --- 391,397 -----
  236.       fl;
  237.   
  238.       access_mode = 0;
  239. !     if (also_read_articles || submask || also_cross_postings)
  240.       access_mode |= ALSO_CROSS_POSTINGS;
  241.       if (dont_split_digests)
  242.       access_mode |= DONT_SPLIT_DIGESTS;
  243. **************
  244. *** 835,841
  245.       free_memory();
  246.   
  247.       access_mode = DONT_SORT_ARTICLES;
  248. !     if (also_read_articles || submask)
  249.       access_mode |= ALSO_CROSS_POSTINGS;
  250.       if (dont_split_digests)
  251.       access_mode |= DONT_SPLIT_DIGESTS;
  252. --- 836,842 -----
  253.       free_memory();
  254.   
  255.       access_mode = DONT_SORT_ARTICLES;
  256. !     if (also_read_articles || submask || also_cross_postings)
  257.       access_mode |= ALSO_CROSS_POSTINGS;
  258.       if (dont_split_digests)
  259.       access_mode |= DONT_SPLIT_DIGESTS;
  260.  
  261. *** /usr/storm/nn6.3.2/keymap.c
  262. --- keymap.c
  263. **************
  264. *** 153,160
  265.   /* ^   */        K_FIRST_PAGE, 
  266.   /* _   */    K_UNBOUND, 
  267.   /* `   */    K_UNBOUND, 
  268. ! /* a   */    K_UNBOUND, 
  269. ! /* b   */    K_UNBOUND, 
  270.   /* c   */        K_COMPRESS, 
  271.   /* d   */        K_NEXT_HALF_PAGE, 
  272.   /* e   */    K_UNBOUND, 
  273. --- 153,160 -----
  274.   /* ^   */        K_FIRST_PAGE, 
  275.   /* _   */    K_UNBOUND, 
  276.   /* `   */    K_UNBOUND, 
  277. ! /* a   */        K_FORW_ARTICLE, 
  278. ! /* b   */        K_BACK_ARTICLE, 
  279.   /* c   */        K_COMPRESS, 
  280.   /* d   */        K_NEXT_HALF_PAGE, 
  281.   /* e   */    K_UNBOUND, 
  282. **************
  283. *** 409,414
  284.       int          cmd_restriction;
  285.   } command_name_map[] = {
  286.       
  287.       "advance-group",        K_ADVANCE_GROUP,    0,
  288.   
  289.       "back-group",        K_BACK_GROUP,        0,
  290. --- 409,415 -----
  291.       int          cmd_restriction;
  292.   } command_name_map[] = {
  293.       
  294. +     "advance-article",        K_FORW_ARTICLE,        K_ONLY_MORE,
  295.       "advance-group",        K_ADVANCE_GROUP,    0,
  296.   
  297.       "back-article",        K_BACK_ARTICLE,        K_ONLY_MORE,
  298. **************
  299. *** 411,416
  300.       
  301.       "advance-group",        K_ADVANCE_GROUP,    0,
  302.   
  303.       "back-group",        K_BACK_GROUP,        0,
  304.   
  305.       "cancel",            K_CANCEL,        0,
  306. --- 412,418 -----
  307.       "advance-article",        K_FORW_ARTICLE,        K_ONLY_MORE,
  308.       "advance-group",        K_ADVANCE_GROUP,    0,
  309.   
  310. +     "back-article",        K_BACK_ARTICLE,        K_ONLY_MORE,
  311.       "back-group",        K_BACK_GROUP,        0,
  312.   
  313.       "cancel",            K_CANCEL,        0,
  314.  
  315. *** /usr/storm/nn6.3.2/keymap.h
  316. --- keymap.h
  317. **************
  318. *** 71,76
  319.   #define K_ROT13            0x0037 /* do rot13             */
  320.   #define K_COMPRESS        0x0038 /* compress spaces        */
  321.   #define K_BACK_TO_MENU        0x0039 /* return to menu */
  322.   
  323.       /* menu() SPECIFIC COMMANDS     */
  324.   
  325. --- 71,78 -----
  326.   #define K_ROT13            0x0037 /* do rot13             */
  327.   #define K_COMPRESS        0x0038 /* compress spaces        */
  328.   #define K_BACK_TO_MENU        0x0039 /* return to menu */
  329. + #define    K_BACK_ARTICLE        0x003a /* back one article        */
  330. + #define    K_FORW_ARTICLE        0x003b /* forward one article        */
  331.   
  332.       /* menu() SPECIFIC COMMANDS     */
  333.   
  334.  
  335. *** /usr/storm/nn6.3.0/kill.c
  336. --- kill.c
  337. **************
  338. *** 1,5
  339.   #include "config.h"
  340.   #include "term.h"
  341.   
  342.   /*
  343.    * kill file handling
  344. --- 1,6 -----
  345.   #include "config.h"
  346.   #include "term.h"
  347. + #include "regexp.h"
  348.   
  349.   /*
  350.    * kill file handling
  351. **************
  352. *** 22,27
  353.   #define    ON_SENDER    0x00    /* pseudo flag */
  354.   
  355.   #define    KILL_MUST_MATCH    0x10
  356.   
  357.   /*
  358.    * external flag representation
  359. --- 23,29 -----
  360.   #define    ON_SENDER    0x00    /* pseudo flag */
  361.   
  362.   #define    KILL_MUST_MATCH    0x10
  363. + #define KILL_ON_REGEXP    0x20
  364.   
  365.   /*
  366.    * external flag representation
  367. **************
  368. *** 32,37
  369.   #define EXT_ON_SUBJECT        's'
  370.   #define    EXT_ON_SENDER        'n'
  371.   #define    EXT_KILL_MUST_MATCH    '='
  372.   
  373.   /*
  374.    * period = nnn DAYS
  375. --- 34,40 -----
  376.   #define EXT_ON_SUBJECT        's'
  377.   #define    EXT_ON_SENDER        'n'
  378.   #define    EXT_KILL_MUST_MATCH    '='
  379. + #define EXT_KILL_ON_REGEXP    '/'
  380.   
  381.   /*
  382.    * period = nnn DAYS
  383. **************
  384. *** 79,85
  385.           if (strcmp(kl->kill_pattern, string))
  386.           continue;
  387.       } else
  388. !         if (quick_match(string, kl->kill_pattern) == NULL)
  389.           continue;
  390.       
  391.       if (kl->kill_flag & AUTO_KILL)
  392. --- 82,89 -----
  393.           if (strcmp(kl->kill_pattern, string))
  394.           continue;
  395.       } else
  396. !     if (kl->kill_flag & KILL_ON_REGEXP) {
  397. !         if (regexec((regexp *)(kl->kill_pattern), string) == 0)
  398.           continue;
  399.       } else
  400.           if (quick_match(string, kl->kill_pattern) == NULL)
  401. **************
  402. *** 81,86
  403.       } else
  404.           if (quick_match(string, kl->kill_pattern) == NULL)
  405.           continue;
  406.       
  407.       if (kl->kill_flag & AUTO_KILL)
  408.           return 1;
  409. --- 85,93 -----
  410.       if (kl->kill_flag & KILL_ON_REGEXP) {
  411.           if (regexec((regexp *)(kl->kill_pattern), string) == 0)
  412.           continue;
  413. +     } else
  414. +         if (quick_match(string, kl->kill_pattern) == NULL)
  415. +         continue;
  416.       
  417.       if (kl->kill_flag & AUTO_KILL)
  418.           return 1;
  419. **************
  420. *** 116,122
  421.           if (strcmp(kl->kill_pattern, string))
  422.           continue;
  423.       } else
  424. !         if (quick_match(string, kl->kill_pattern) == NULL)
  425.           continue;
  426.       return 1;
  427.       }
  428. --- 123,130 -----
  429.           if (strcmp(kl->kill_pattern, string))
  430.           continue;
  431.       } else
  432. !     if (kl->kill_flag & KILL_ON_REGEXP) {
  433. !         if (regexec((regexp *)(kl->kill_pattern), string) == 0)
  434.           continue;
  435.       } else
  436.           if (quick_match(string, kl->kill_pattern) == NULL)
  437. **************
  438. *** 118,123
  439.       } else
  440.           if (quick_match(string, kl->kill_pattern) == NULL)
  441.           continue;
  442.       return 1;
  443.       }
  444.       
  445. --- 126,134 -----
  446.       if (kl->kill_flag & KILL_ON_REGEXP) {
  447.           if (regexec((regexp *)(kl->kill_pattern), string) == 0)
  448.           continue;
  449. +     } else
  450. +         if (quick_match(string, kl->kill_pattern) == NULL)
  451. +         continue;
  452.       return 1;
  453.       }
  454.       
  455. **************
  456. *** 139,144
  457.       register kill_list_entry *kl;
  458.       char *str;
  459.       
  460.       killf = open_file(relative(nn_directory, "kill"), OPEN_APPEND);
  461.       if (killf == NULL) {
  462.       msg("cannot create kill file");
  463. --- 150,168 -----
  464.       register kill_list_entry *kl;
  465.       char *str;
  466.       
  467. +     if (flag & KILL_ON_REGEXP) {
  468. +     str = (char *)regcomp(pattern);
  469. +     if (str == NULL) return;
  470. +     } else {
  471. +     str = malloc(strlen(pattern) + 1);
  472. +     mem_check(str, 1, "string");
  473. +     
  474. +     strcpy(str, pattern);
  475. +     
  476. +     if ((flag & KILL_MUST_MATCH) == 0)
  477. +         init_quick_match(str);
  478. +     }
  479. +     
  480.       killf = open_file(relative(nn_directory, "kill"), OPEN_APPEND);
  481.       if (killf == NULL) {
  482.       msg("cannot create kill file");
  483. **************
  484. *** 157,162
  485.       fputc(flag & AUTO_KILL ? EXT_AUTO_KILL : EXT_AUTO_SELECT, killf);
  486.       fputc(flag & ON_SUBJECT ? EXT_ON_SUBJECT : EXT_ON_SENDER, killf);
  487.       if (flag & KILL_MUST_MATCH) fputc(EXT_KILL_MUST_MATCH, killf);
  488.       fputc(':', killf);
  489.   
  490.       fputs(pattern, killf);
  491. --- 181,187 -----
  492.       fputc(flag & AUTO_KILL ? EXT_AUTO_KILL : EXT_AUTO_SELECT, killf);
  493.       fputc(flag & ON_SUBJECT ? EXT_ON_SUBJECT : EXT_ON_SENDER, killf);
  494.       if (flag & KILL_MUST_MATCH) fputc(EXT_KILL_MUST_MATCH, killf);
  495. +     if (flag & KILL_ON_REGEXP) fputc(EXT_KILL_ON_REGEXP, killf);
  496.       fputc(':', killf);
  497.   
  498.       fputs(pattern, killf);
  499. **************
  500. *** 165,178
  501.       fclose(killf);
  502.       rm_kill_file();
  503.       
  504. -     str = malloc(strlen(pattern) + 1);
  505. -     mem_check(str, 1, "string");
  506. -     
  507. -     strcpy(str, pattern);
  508. -     
  509. -     if ((flag & KILL_MUST_MATCH) == 0)
  510. -     init_quick_match(str);
  511. -     
  512.       kl = (kill_list_entry *)calloc(1, sizeof(kill_list_entry));
  513.       mem_check(kl, 1, "kill list entry");
  514.       
  515. --- 190,195 -----
  516.       fclose(killf);
  517.       rm_kill_file();
  518.       
  519.       kl = (kill_list_entry *)calloc(1, sizeof(kill_list_entry));
  520.       mem_check(kl, 1, "kill list entry");
  521.       
  522. **************
  523. *** 269,275
  524.   
  525.       prompt("\1%s %s:\1", mode1, mode2);
  526.       
  527. !     pattern = get_s(dflt, NONE, "%=", NO_COMPLETION);
  528.       if (pattern == NULL) return;
  529.       if (*pattern == NUL || *pattern == '%' || *pattern == '=') {
  530.       if (dflt && *dflt)
  531. --- 286,292 -----
  532.   
  533.       prompt("\1%s %s:\1", mode1, mode2);
  534.       
  535. !     pattern = get_s(dflt, NONE, "%=/", NO_COMPLETION);
  536.       if (pattern == NULL) return;
  537.       if (*pattern == NUL || *pattern == '%' || *pattern == '=') {
  538.       if (dflt && *dflt)
  539. **************
  540. *** 279,285
  541.           pattern = (flag & ON_SUBJECT) ? ah->subject : ah->sender;
  542.       }
  543.       flag |= KILL_MUST_MATCH;
  544. !     }
  545.       
  546.       strcpy(buffer, pattern);
  547.       pattern = buffer;
  548. --- 296,304 -----
  549.           pattern = (flag & ON_SUBJECT) ? ah->subject : ah->sender;
  550.       }
  551.       flag |= KILL_MUST_MATCH;
  552. !     } else
  553. !     if (*pattern == '/') {
  554. !         prompt("\1%s %s\1 (regexp): ", mode1, mode2);
  555.       
  556.           pattern = get_s(NONE, NONE, NONE, NO_COMPLETION);
  557.           if (pattern == NULL || *pattern == NUL) return;
  558. **************
  559. *** 281,286
  560.       flag |= KILL_MUST_MATCH;
  561.       }
  562.       
  563.       strcpy(buffer, pattern);
  564.       pattern = buffer;
  565.       
  566. --- 300,310 -----
  567.       if (*pattern == '/') {
  568.           prompt("\1%s %s\1 (regexp): ", mode1, mode2);
  569.       
  570. +         pattern = get_s(NONE, NONE, NONE, NO_COMPLETION);
  571. +         if (pattern == NULL || *pattern == NUL) return;
  572. +         flag |= KILL_ON_REGEXP;
  573. +     }
  574. +     
  575.       strcpy(buffer, pattern);
  576.       pattern = buffer;
  577.       
  578. **************
  579. *** 323,329
  580.   
  581.       prompt("\1CONFIRM\1 %s %s %s%s: %-.35s%s ",
  582.          mode1, mode2, days_str, 
  583. !        (flag & KILL_MUST_MATCH) ? " exact" : "",
  584.          pattern, strlen(pattern) > 35 ? "..." : "");
  585.       if (yes(0) <= 0) return;
  586.       
  587. --- 347,354 -----
  588.   
  589.       prompt("\1CONFIRM\1 %s %s %s%s: %-.35s%s ",
  590.          mode1, mode2, days_str, 
  591. !        (flag & KILL_MUST_MATCH) ? " exact" : 
  592. !        (flag & KILL_ON_REGEXP) ? " regexp" : "",
  593.          pattern, strlen(pattern) > 35 ? "..." : "");
  594.       if (yes(0) <= 0) return;
  595.       
  596. **************
  597. *** 372,377
  598.       
  599.       kl->kill_pattern = patterns + entry.ck_pattern_index;
  600.       kl->kill_flag = entry.ck_flag;
  601.       
  602.       if (entry.ck_group >= 0) {
  603.           gh = active_groups + entry.ck_group;
  604. --- 397,405 -----
  605.       
  606.       kl->kill_pattern = patterns + entry.ck_pattern_index;
  607.       kl->kill_flag = entry.ck_flag;
  608. +     if (kl->kill_flag & KILL_ON_REGEXP) 
  609. +         kl->kill_pattern = (char *)regcomp(kl->kill_pattern);
  610.       
  611.       if (entry.ck_group >= 0) {
  612.           gh = active_groups + entry.ck_group;
  613. **************
  614. *** 500,505
  615.            case EXT_KILL_MUST_MATCH:
  616.           flag |= KILL_MUST_MATCH;
  617.           continue;
  618.            case ':':
  619.           break;
  620.            case NL:
  621. --- 528,536 -----
  622.            case EXT_KILL_MUST_MATCH:
  623.           flag |= KILL_MUST_MATCH;
  624.           continue;
  625. +          case EXT_KILL_ON_REGEXP:
  626. +         flag |= KILL_ON_REGEXP;
  627. +         continue;
  628.            case ':':
  629.           break;
  630.            case NL:
  631. **************
  632. *** 517,523
  633.       if ((np = strchr(cp, NL)) == NULL) goto bad_entry;
  634.       
  635.       *np++ = NUL;
  636. !     if ((flag & KILL_MUST_MATCH) == 0)
  637.           init_quick_match(cp);
  638.       
  639.       entry.ck_pattern_index = ftell(patternf);
  640. --- 548,554 -----
  641.       if ((np = strchr(cp, NL)) == NULL) goto bad_entry;
  642.       
  643.       *np++ = NUL;
  644. !     if ((flag & (KILL_MUST_MATCH | KILL_ON_REGEXP)) == 0)
  645.           init_quick_match(cp);
  646.       
  647.       entry.ck_pattern_index = ftell(patternf);
  648. **************
  649. *** 638,644
  650.       printf("\r%s ON %s '%.35s'%s\n",
  651.          kl->kill_flag & AUTO_KILL ? "KILL" : "SELECT",
  652.          kl->kill_flag & ON_SUBJECT ? "SUBJECT" : "NAME",
  653. !        kl->kill_pattern,
  654.          kl->kill_flag & KILL_MUST_MATCH ? " (exact)" : "");
  655.   
  656.       return 0;
  657. --- 669,675 -----
  658.       printf("\r%s ON %s '%.35s'%s\n",
  659.          kl->kill_flag & AUTO_KILL ? "KILL" : "SELECT",
  660.          kl->kill_flag & ON_SUBJECT ? "SUBJECT" : "NAME",
  661. !        kl->kill_flag & KILL_ON_REGEXP ? "*regexp*" : kl->kill_pattern,
  662.          kl->kill_flag & KILL_MUST_MATCH ? " (exact)" : "");
  663.   
  664.       return 0;
  665.  
  666. *** /usr/storm/nn6.3.0/m-template.h
  667. --- m-template.h
  668. **************
  669. *** 27,32
  670.   
  671.   /* #define NO_VARARGS */
  672.   
  673.   
  674.   
  675.   #ifdef NETWORK_DATABASE
  676. --- 27,45 -----
  677.   
  678.   /* #define NO_VARARGS */
  679.   
  680. + /*
  681. +  *    Define STRCSPN if the strcspn() function is not available.
  682. +  */
  683. + /* #define STRCSPN     /* */
  684. + /*
  685. +  *    Define NO_SIGINTERRUPT on BSD based systems which don't have
  686. +  *    a siginterrupt() function, but provides an SV_INTERRUPT flag
  687. +  *    in <signal.h>.
  688. +  */
  689. + /* #define NO_SIGINTERRUPT    /* */
  690.   
  691.   
  692.   #ifdef NETWORK_DATABASE
  693.  
  694. *** /usr/storm/nn6.3.0/master.c
  695. --- master.c
  696. **************
  697. *** 115,120
  698.       nn_exit(0);
  699.       }
  700.   
  701.       if (repeat_delay && !debug_mode) {
  702.       while ((temp = fork()) < 0) sleep(1);
  703.       if (temp) nn_exit(0);
  704. --- 115,126 -----
  705.       nn_exit(0);
  706.       }
  707.   
  708. +     if (!debug_mode) {
  709. +     close(0);
  710. +     close(1);
  711. +     close(2);
  712. +     }
  713. +     
  714.       if (repeat_delay && !debug_mode) {
  715.       while ((temp = fork()) < 0) sleep(1);
  716.       if (temp) nn_exit(0);
  717.  
  718. *** /usr/storm/nn6.3.2/menu.c
  719. --- menu.c
  720. **************
  721. *** 1016,1022
  722.        show:
  723.           mode = 0;
  724.           if (prev >= 0) mode |= MM_PREVIOUS;
  725. !         if (next == n_articles) mode |= MM_LAST_ARTICLE;
  726.           
  727.           cmd = more(articles[cur], mode, 0);
  728.           
  729. --- 1016,1024 -----
  730.        show:
  731.           mode = 0;
  732.           if (prev >= 0) mode |= MM_PREVIOUS;
  733. !         if (next == n_articles) mode |= MM_LAST_SELECTED;
  734. !         if ((cur + 1) >= n_articles) mode |= MM_LAST_ARTICLE;
  735. !         if (cur == 0) mode |= MM_FIRST_ARTICLE;
  736.           
  737.           cmd = more(articles[cur], mode, 0);
  738.           
  739. **************
  740. *** 1061,1066
  741.            case MC_NEXT:
  742.           if (articles[cur]->flag & A_SELECT) again++;
  743.           break;
  744.           
  745.            case MC_NEXTGROUP:
  746.           return SH_NEXT;
  747. --- 1063,1075 -----
  748.            case MC_NEXT:
  749.           if (articles[cur]->flag & A_SELECT) again++;
  750.           break;
  751. +          case MC_BACK_ART:
  752. +         if (cur > 0) {
  753. +             next = cur - 1;
  754. +             break;
  755. +         }
  756. +         goto show;
  757.           
  758.            case MC_FORW_ART:
  759.           next = cur + 1;
  760. **************
  761. *** 1062,1067
  762.           if (articles[cur]->flag & A_SELECT) again++;
  763.           break;
  764.           
  765.            case MC_NEXTGROUP:
  766.           return SH_NEXT;
  767.           
  768. --- 1071,1080 -----
  769.           }
  770.           goto show;
  771.           
  772. +          case MC_FORW_ART:
  773. +         next = cur + 1;
  774. +         break;
  775. +         
  776.            case MC_NEXTGROUP:
  777.           return SH_NEXT;
  778.           
  779. **************
  780. *** 1178,1184
  781.   alt_command()
  782.   {
  783.       int ok_val, macro_cmd;
  784. !     char *cmd;
  785.       extern char erase_key;
  786.       extern int get_from_macro;
  787.       extern int alt_completion();
  788. --- 1191,1197 -----
  789.   alt_command()
  790.   {
  791.       int ok_val, macro_cmd;
  792. !     char *cmd, brkchars[10];
  793.       extern char erase_key;
  794.       extern int get_from_macro;
  795.       extern int alt_completion();
  796. **************
  797. *** 1188,1195
  798.       
  799.    again:
  800.       
  801. !     cmd = "?? ";
  802. !     cmd[1] = erase_key;
  803.       
  804.       cmd = get_s(NONE, NONE, cmd, alt_completion);
  805.       if (cmd == NULL ||
  806. --- 1201,1207 -----
  807.       
  808.    again:
  809.       
  810. !     sprintf(brkchars, "?%c ", erase_key);
  811.       
  812.       cmd = get_s(NONE, NONE, brkchars, alt_completion);
  813.       if (cmd == NULL ||
  814. **************
  815. *** 1191,1197
  816.       cmd = "?? ";
  817.       cmd[1] = erase_key;
  818.       
  819. !     cmd = get_s(NONE, NONE, cmd, alt_completion);
  820.       if (cmd == NULL ||
  821.       *cmd == NUL || *cmd == SP || *cmd == erase_key)
  822.       return ok_val;
  823. --- 1203,1209 -----
  824.       
  825.       sprintf(brkchars, "?%c ", erase_key);
  826.       
  827. !     cmd = get_s(NONE, NONE, brkchars, alt_completion);
  828.       if (cmd == NULL ||
  829.       *cmd == NUL || *cmd == SP || *cmd == erase_key)
  830.       return ok_val;
  831.  
  832. *** /usr/storm/nn6.3.0/menu.h
  833. --- menu.h
  834. **************
  835. *** 31,36
  836.   #define MC_PREVIEW_OTHER 9    /* preview another article */
  837.   #define MC_REDRAW    10    /* redraw screen after return */
  838.   #define MC_NO_REDRAW    11    /* screen is not corrupted */
  839.   
  840.   /* more modes */
  841.   
  842. --- 31,38 -----
  843.   #define MC_PREVIEW_OTHER 9    /* preview another article */
  844.   #define MC_REDRAW    10    /* redraw screen after return */
  845.   #define MC_NO_REDRAW    11    /* screen is not corrupted */
  846. + #define    MC_BACK_ART    12    /* back one article (don't deselect cur) */
  847. + #define MC_FORW_ART    13    /* forward one article (deselect cur) */
  848.   
  849.   /* more modes */
  850.   
  851. **************
  852. *** 34,45
  853.   
  854.   /* more modes */
  855.   
  856. ! #define    MM_NORMAL    0    /* show article */
  857. ! #define MM_DIGEST    1    /* show full digest */
  858. ! #define MM_PREVIOUS    0x10    /* previous article exists */
  859. ! #define MM_LAST_ARTICLE    0x20    /* last article in group */
  860. ! #define MM_LAST_GROUP    0x40    /* last group */
  861. ! #define MM_PREVIEW    0x80    /* preview mode flag */
  862.   
  863.   /* alt_command return values */
  864.   
  865. --- 36,49 -----
  866.   
  867.   /* more modes */
  868.   
  869. ! #define    MM_NORMAL        0x0000    /* show article */
  870. ! #define MM_DIGEST        0x0001    /* show full digest */
  871. ! #define MM_PREVIOUS        0x0010    /* previous article exists */
  872. ! #define MM_LAST_SELECTED    0x0020    /* last selected article in group */
  873. ! #define MM_LAST_GROUP        0x0040    /* last group */
  874. ! #define MM_PREVIEW        0x0080    /* preview mode flag */
  875. ! #define MM_FIRST_ARTICLE     0x0100    /* first article in group */
  876. ! #define MM_LAST_ARTICLE        0x0200    /* last article in group */
  877.   
  878.   /* alt_command return values */
  879.   
  880.  
  881. *** /usr/storm/nn6.3.2/more.c
  882. --- more.c
  883. **************
  884. *** 50,55
  885.       0
  886.   };
  887.   
  888.   
  889.   more(ah, mode, screen_offset)
  890.   article_header *ah;
  891. --- 50,97 -----
  892.       0
  893.   };
  894.   
  895. + static char *a_st_flags(flag)
  896. + int32 flag;
  897. + {
  898. +     static char buf[40];
  899. +     register char *cp, *sp;
  900. +     static int32 prevflag = 0;
  901. +     
  902. +     flag &= A_ST_FILED | A_ST_REPLY | A_ST_FOLLOW;
  903. +     if (flag == 0) {
  904. +     prevflag = 0;
  905. +     return "";
  906. +     }
  907. +     
  908. +     if (flag == prevflag) return buf;
  909. +     prevflag = flag;
  910. +     
  911. +     cp = buf;
  912. +     *cp++ = '(';
  913. +     if (flag & A_ST_FILED) {
  914. +     *cp++ = 'F';
  915. +     *cp++ = 'i';
  916. +     *cp++ = 'l';
  917. +     *cp++ = 'e';
  918. +     *cp++ = 'd';
  919. +     }
  920. +     
  921. +     if (flag & A_ST_REPLY) {
  922. +     if (cp[-1] != '(') *cp++ = SP;
  923. +     *cp++ = 'R';
  924. +     *cp++ = 'e';
  925. +     }
  926. +     
  927. +     if (flag & A_ST_FOLLOW) {
  928. +     if (cp[-1] != '(') *cp++ = SP;
  929. +     *cp++ = 'F';
  930. +     *cp++ = 'o';
  931. +     *cp++ = 'l';
  932. +     }
  933. +     
  934. +     strcpy(cp, ")------");
  935. +     return buf;
  936. + }
  937.   
  938.   more(ah, mode, screen_offset)
  939.   article_header *ah;
  940. **************
  941. *** 149,155
  942.       stop_line = first_page_lines ? first_page_lines : -1;
  943.   
  944.       sprintf(pr_fmt,
  945. !        "\1\2-- %s%s %s-----%%s-----\1",
  946.          (mode & MM_PREVIEW) ? "PREVIEW " : "",
  947.          (mode & MM_DIGEST) ? "FULL DIGEST" :
  948.          (mode & MM_LAST_ARTICLE) ? "LAST ARTICLE" : "ARTICLE",
  949. --- 191,197 -----
  950.       stop_line = first_page_lines ? first_page_lines : -1;
  951.   
  952.       sprintf(pr_fmt,
  953. !        "\1\2-- %s%s %s-----%%s-----%%s\1",
  954.          (mode & MM_PREVIEW) ? "PREVIEW " : "",
  955.          (mode & MM_DIGEST) ? "FULL DIGEST" :
  956.          (mode & MM_LAST_SELECTED) ? "LAST ARTICLE" : "ARTICLE",
  957. **************
  958. *** 152,158
  959.          "\1\2-- %s%s %s-----%%s-----\1",
  960.          (mode & MM_PREVIEW) ? "PREVIEW " : "",
  961.          (mode & MM_DIGEST) ? "FULL DIGEST" :
  962. !        (mode & MM_LAST_ARTICLE) ? "LAST ARTICLE" : "ARTICLE",
  963.          novice ? "-- help:? " : "");
  964.   
  965.       if (screen_offset) goto safe_redraw;
  966. --- 194,200 -----
  967.          "\1\2-- %s%s %s-----%%s-----%%s\1",
  968.          (mode & MM_PREVIEW) ? "PREVIEW " : "",
  969.          (mode & MM_DIGEST) ? "FULL DIGEST" :
  970. !        (mode & MM_LAST_SELECTED) ? "LAST ARTICLE" : "ARTICLE",
  971.          novice ? "-- help:? " : "");
  972.   
  973.       if (screen_offset) goto safe_redraw;
  974. **************
  975. *** 576,582
  976.   
  977.       prompt(pr_fmt,
  978.          pct((long)(ah->fpos), (long)(ah->lpos), 
  979. !            (long)(linepos[topline]), (long)ftell(art)));
  980.   
  981.       if (delayed_msg != NULL) {
  982.       msg(delayed_msg);
  983. --- 618,625 -----
  984.   
  985.       prompt(pr_fmt,
  986.          pct((long)(ah->fpos), (long)(ah->lpos), 
  987. !            (long)(linepos[topline]), (long)ftell(art)),
  988. !        a_st_flags(ah->flag));
  989.   
  990.       if (delayed_msg != NULL) {
  991.       msg(delayed_msg);
  992. **************
  993. *** 905,910
  994.       if ((mode & MM_PREVIEW) == 0) break;
  995.       more_return(MC_PREVIEW_NEXT);
  996.   
  997.        case K_NEXT_SUBJECT:
  998.       more_return(MC_NEXTSUBJ);
  999.       
  1000. --- 948,967 -----
  1001.       if ((mode & MM_PREVIEW) == 0) break;
  1002.       more_return(MC_PREVIEW_NEXT);
  1003.   
  1004. +      case K_BACK_ARTICLE:
  1005. +     if (mode & MM_FIRST_ARTICLE) {
  1006. +         msg("First article is displayed");
  1007. +         goto same_prompt;
  1008. +     }
  1009. +     more_return(MC_BACK_ART);
  1010. +     
  1011. +      case K_FORW_ARTICLE:
  1012. +     if (mode & MM_LAST_ARTICLE) {
  1013. +         msg("Last article is displayed");
  1014. +         goto same_prompt;
  1015. +     }
  1016. +     more_return(MC_FORW_ART);
  1017. +     
  1018.        case K_NEXT_SUBJECT:
  1019.       more_return(MC_NEXTSUBJ);
  1020.       
  1021.  
  1022. *** /usr/storm/nn6.3.2/nn.1
  1023. --- nn.1
  1024. **************
  1025. *** 552,558
  1026.   The following commands are used to move among the selected articles.
  1027.   .TP
  1028.   \&\fBn\fP    {\fBnext-article\fP}
  1029. ! Goto next article.  This command skips the rest of the current article
  1030.   and jumps directly to the first page of the next article (or to the
  1031.   next group if it is the last article).
  1032.   .TP
  1033. --- 552,558 -----
  1034.   The following commands are used to move among the selected articles.
  1035.   .TP
  1036.   \&\fBn\fP    {\fBnext-article\fP}
  1037. ! Goto next selected article.  This command skips the rest of the current article
  1038.   and jumps directly to the first page of the next article (or to the
  1039.   next group if it is the last article).
  1040.   .TP
  1041. **************
  1042. *** 583,588
  1043.   select only the first article on a subject in selection mode, and then
  1044.   select all follow-ups in reading mode if you find the article
  1045.   interesting.
  1046.   .LP
  1047.   The following commands perform an 
  1048.   immediate return from reading mode to selection mode in
  1049. --- 583,598 -----
  1050.   select only the first article on a subject in selection mode, and then
  1051.   select all follow-ups in reading mode if you find the article
  1052.   interesting.
  1053. + .TP
  1054. + \&\fBa\fP    {\fBadvance-article\fP}
  1055. + Goto the following article on the menu even if it is not selected.
  1056. + This command skips the rest of the current article 
  1057. + and jumps directly to the first page of the next article (it will not skip
  1058. + to the next group if it is the last article).
  1059. + .TP
  1060. + \&\fBb\fP    {\fBback-article\fP}
  1061. + Goto the article before current article on the menu even if it is not
  1062. + selected.
  1063.   .LP
  1064.   The following commands perform an 
  1065.   immediate return from reading mode to selection mode in
  1066. **************
  1067. *** 1267,1272
  1068.   name or subject matches the original name or subject exactly including
  1069.   case.
  1070.   .sp 0.5v
  1071.   Otherwise, \fInn\fP will select or kill articles which 
  1072.   .I contain
  1073.   the specified name or subject (or part thereof) anywhere in the name
  1074. --- 1277,1286 -----
  1075.   name or subject matches the original name or subject exactly including
  1076.   case.
  1077.   .sp 0.5v
  1078. + If the first character typed at the prompt is a slash `/', the rest of
  1079. + the line is used as a \fIregular expression\fP which is used to match
  1080. + the name or subject.
  1081. + .sp 0.5v
  1082.   Otherwise, \fInn\fP will select or kill articles which 
  1083.   .I contain
  1084.   the specified name or subject (or part thereof) anywhere in the name
  1085. **************
  1086. *** 1330,1336
  1087.   specifying whether the entry applies to the
  1088.   name or to the subject of an article.
  1089.   .br
  1090. ! \- The optional third character is an 
  1091.   .B =
  1092.   sign which
  1093.   specify that the match against the name or subject must be an
  1094. --- 1344,1350 -----
  1095.   specifying whether the entry applies to the
  1096.   name or to the subject of an article.
  1097.   .br
  1098. ! \- The optional third character can be an 
  1099.   .B =
  1100.   sign which
  1101.   specify that the match against the name or subject must be an
  1102. **************
  1103. *** 1334,1340
  1104.   .B =
  1105.   sign which
  1106.   specify that the match against the name or subject must be an
  1107. ! exact match (including case).
  1108.   .LP
  1109.   The 
  1110.   .I string
  1111. --- 1348,1355 -----
  1112.   .B =
  1113.   sign which
  1114.   specify that the match against the name or subject must be an
  1115. ! exact match (including case), or it can be a slash `/' specifying that
  1116. ! the name or subject is matched against a regular expression.
  1117.   .LP
  1118.   The 
  1119.   .I string
  1120. **************
  1121. *** 1338,1344
  1122.   .LP
  1123.   The 
  1124.   .I string
  1125. ! field in the entry is the name or subject that will be
  1126.   matched against the name or subject of each article in the group (or
  1127.   all groups).  Notice, that unless an exact match is specified, the
  1128.   specified name or subject may occur
  1129. --- 1353,1359 -----
  1130.   .LP
  1131.   The 
  1132.   .I string
  1133. ! field in the entry is the name, subject or regular expression that will be
  1134.   matched against the name or subject of each article in the group (or
  1135.   all groups).  Notice, that unless an exact match or a regular
  1136.   expression match is specified, the
  1137. **************
  1138. *** 1340,1346
  1139.   .I string
  1140.   field in the entry is the name or subject that will be
  1141.   matched against the name or subject of each article in the group (or
  1142. ! all groups).  Notice, that unless an exact match is specified, the
  1143.   specified name or subject may occur
  1144.   .I anywhere
  1145.   in a name or a subject, and that case is ignored.
  1146. --- 1355,1362 -----
  1147.   .I string
  1148.   field in the entry is the name, subject or regular expression that will be
  1149.   matched against the name or subject of each article in the group (or
  1150. ! all groups).  Notice, that unless an exact match or a regular
  1151. ! expression match is specified, the
  1152.   specified name or subject may occur
  1153.   .I anywhere
  1154.   in a name or a subject, and that case is ignored.
  1155. **************
  1156. *** 1702,1707
  1157.   is set, you will also be asked for confirmation before appending an
  1158.   article to an existing file.
  1159.   .TP
  1160.   \fBdate\fP        (boolean, default true)
  1161.   If set \fInn\fP will show the article posting date when articles are
  1162.   read.
  1163. --- 1718,1730 -----
  1164.   is set, you will also be asked for confirmation before appending an
  1165.   article to an existing file.
  1166.   .TP
  1167. + \fBcross-post\fP        (boolean, default false) 
  1168. + Normally, \fInn\fP will only show cross-posted articles in the first
  1169. + subscribed group on the Newsgroups: line.  When
  1170. + .B cross-post
  1171. + is set, \fInn\fP will show cross-posted articles in all subscribed
  1172. + groups to which they are posted.
  1173. + .TP
  1174.   \fBdate\fP        (boolean, default true)
  1175.   If set \fInn\fP will show the article posting date when articles are
  1176.   read.
  1177. **************
  1178. *** 2265,2270
  1179.   .br
  1180.   \fIFunction    Selection mode    Reading mode
  1181.   .br
  1182.   \fBadvance-group\fP    A     A 
  1183.   .br
  1184.   \fBback-group\fP    B     B 
  1185. --- 2288,2295 -----
  1186.   .br
  1187.   \fIFunction    Selection mode    Reading mode
  1188.   .br
  1189. + \fBadvance-article\fP    \fBnix\fP     a 
  1190. + .br
  1191.   \fBadvance-group\fP    A     A 
  1192.   .br
  1193.   \fBback-article\fP    \fBnix\fP     b 
  1194. **************
  1195. *** 2266,2271
  1196.   \fIFunction    Selection mode    Reading mode
  1197.   .br
  1198.   \fBadvance-group\fP    A     A 
  1199.   .br
  1200.   \fBback-group\fP    B     B 
  1201.   .br
  1202. --- 2291,2298 -----
  1203.   \fBadvance-article\fP    \fBnix\fP     a 
  1204.   .br
  1205.   \fBadvance-group\fP    A     A 
  1206. + .br
  1207. + \fBback-article\fP    \fBnix\fP     b 
  1208.   .br
  1209.   \fBback-group\fP    B     B 
  1210.   .br
  1211.  
  1212. *** /usr/storm/nn6.3.0/nnquery.sh
  1213. --- nnquery.sh
  1214. **************
  1215. *** 1,6
  1216.   # CONFIG file is insert above this line by make
  1217.   
  1218. ! if [ -f ${ACTIVE} ] ; then
  1219.       echo "Cannot locate active file ${ACTIVE}"
  1220.       exit 3
  1221.   fi
  1222. --- 1,6 -----
  1223.   # CONFIG file is insert above this line by make
  1224.   
  1225. ! if [ ! -f ${ACTIVE} ] ; then
  1226.       echo "Cannot locate active file ${ACTIVE}"
  1227.       exit 3
  1228.   fi
  1229.  
  1230. *** /usr/storm/nn6.3.2/prefix.sh
  1231. --- prefix.sh
  1232. **************
  1233. *** 1,4
  1234. ! WARNING: DON'T CHANGE THE ORDER OR CONTENTS OF THE FOLLOWING LINES
  1235.   
  1236.   #include "config.h"
  1237.   #include "patchlevel.h"
  1238. --- 1,4 -----
  1239. ! WARNING: DO NOT CHANGE THE ORDER OR CONTENTS OF THE FOLLOWING LINES
  1240.   
  1241.   #include "config.h"
  1242.   #include "patchlevel.h"
  1243. **************
  1244. *** 5,11
  1245.   #include "update.h"
  1246.   
  1247.   --------CUT PREFIX HERE--------
  1248. ! #ifndef AVOID_SHELL_EXEC
  1249.   &!/bin/sh
  1250.   #endif
  1251.   
  1252. --- 5,13 -----
  1253.   #include "update.h"
  1254.   
  1255.   --------CUT PREFIX HERE--------
  1256. ! #ifdef AVOID_SHELL_EXEC
  1257. ! :
  1258. ! #else
  1259.   &!/bin/sh
  1260.   #endif
  1261.   
  1262.  
  1263. *** /usr/storm/nn6.3.2/save.c
  1264. --- save.c
  1265. **************
  1266. *** 456,461
  1267.   #endif    
  1268.       if (was_raw) raw();    
  1269.   
  1270.       return !s_pipe || (save_mode & SEPARATE_FILES);
  1271.   }
  1272.   
  1273. --- 456,463 -----
  1274.   #endif    
  1275.       if (was_raw) raw();    
  1276.   
  1277. +     ah->flag |= A_ST_FILED;
  1278. +     
  1279.       return !s_pipe || (save_mode & SEPARATE_FILES);
  1280.   }
  1281.   
  1282.  
  1283. *** /usr/storm/nn6.3.2/term.c
  1284. --- term.c
  1285. **************
  1286. *** 204,209
  1287.   }
  1288.   #endif /* RESIZING */
  1289.   
  1290.   
  1291.   init_term()
  1292.   {
  1293. --- 204,221 -----
  1294.   }
  1295.   #endif /* RESIZING */
  1296.   
  1297. + #ifdef SV_INTERRUPT
  1298. + #ifdef NO_SIGINTERRUPT
  1299. + static siginterrupt(signo, on)
  1300. + {
  1301. +   struct sigvec sv;
  1302. +   sv.sv_handler = signal (signo, SIG_DFL);
  1303. +   sv.sv_mask = 0;
  1304. +   sv.sv_flags = on ? SV_INTERRUPT : 0;
  1305. +   sigvec (signo, &sv, 0);
  1306. + }
  1307. + #endif
  1308. + #endif
  1309.   
  1310.   init_term()
  1311.   {
  1312.  
  1313. *** /usr/storm/nn6.3.0/variable.c
  1314. --- variable.c
  1315. **************
  1316. *** 23,28
  1317.       *save_counter_format;
  1318.   
  1319.   import int            /* boolean variables */
  1320.       conf_append,
  1321.       conf_dont_sleep,
  1322.       delay_redraw,
  1323. --- 23,29 -----
  1324.       *save_counter_format;
  1325.   
  1326.   import int            /* boolean variables */
  1327. +     also_cross_postings,
  1328.       conf_append,
  1329.       conf_dont_sleep,
  1330.       delay_redraw,
  1331. **************
  1332. *** 81,86
  1333.       "comp2_key",    V_KEY,        0,    (char **)&comp2_key,
  1334.       "confirm",        V_BOOLEAN,    0,    (char **)&conf_dont_sleep,
  1335.       "confirm-append",    V_BOOLEAN,    0,    (char **)&conf_append,
  1336.       "date",        V_BOOLEAN,    0,    (char **)&show_article_date,
  1337.       "debug",        V_INTEGER,    0,    (char **)&Debug,
  1338.       "default-save-file",V_STRING,    0,    (char **)&default_save_file,
  1339. --- 82,88 -----
  1340.       "comp2_key",    V_KEY,        0,    (char **)&comp2_key,
  1341.       "confirm",        V_BOOLEAN,    0,    (char **)&conf_dont_sleep,
  1342.       "confirm-append",    V_BOOLEAN,    0,    (char **)&conf_append,
  1343. +     "cross-post",    V_BOOLEAN,    0,    (char **)&also_cross_postings,
  1344.       "date",        V_BOOLEAN,    0,    (char **)&show_article_date,
  1345.       "debug",        V_INTEGER,    0,    (char **)&Debug,
  1346.       "default-save-file",V_STRING,    0,    (char **)&default_save_file,
  1347.  
  1348. *** /usr/storm/nn6.3.2/xmakefile
  1349. --- xmakefile
  1350. **************
  1351. *** 123,129
  1352.   * Compilation counter updating
  1353.   *
  1354.   
  1355. ! update.o:    update.h update.c
  1356.       -$(CC) -c $(CFLAGS) update.c
  1357.   
  1358.   *
  1359. --- 123,129 -----
  1360.   * Compilation counter updating
  1361.   *
  1362.   
  1363. ! update.o:    update.h update.c patchlevel.h
  1364.       -$(CC) -c $(CFLAGS) update.c
  1365.   
  1366.   *
  1367. **************
  1368. *** 259,265
  1369.   nn1:    $(NN) 
  1370.       $(CC) $(CFLAGS) $(NN) TERMLIB EXTRA_LIB -Mnn1 -o nn1
  1371.   
  1372. ! * this is probably non-portable so it is ifdef'ed
  1373.   
  1374.   #ifdef WITH_LINT
  1375.   lint:
  1376. --- 259,265 -----
  1377.   nn1:    $(NN) 
  1378.       $(CC) $(CFLAGS) $(NN) TERMLIB EXTRA_LIB -Mnn1 -o nn1
  1379.   
  1380. ! * this is probably non-portable so it is ifdef-ed
  1381.   
  1382.   #ifdef WITH_LINT
  1383.   lint:
  1384.  
  1385. -- 
  1386. Kim F. Storm        storm@texas.dk        Tel +45 429 174 00
  1387. Texas Instruments, Marielundvej 46E, DK-2730 Herlev, Denmark
  1388.       No news is good news, but nn is better!
  1389.  
  1390.